package com.young.launch_task_init.core.task

import android.app.Application
import com.young.launch_task_init.core.task.base.BaseTask
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit

/**
 * Author：young
 * .
 * Time： 1/4/2023 上午12:53 周六
 * .
 * Desc：异步任务
 *
 * 第三方库的初始化方法是异步的，就可以构建异步任务
 *
 * 例如：融云 IM 的SDK初始化，假设设置成用户 id，才可以进入主页，那么就需要异步等待 setUserInfoProvider 回调
 *
 *      初始化融云
 *       RongIM.init(this);
 *
 *       RongIM.setUserInfoProvider(object : UserInfoProvider() {
 *           fun getUserInfo(userId: String): UserInfo? {
 *           // 提供的是融云的ID
 *           // 在这里通过融云ID向自己的后台请求用户数据
 *               return UserInfo(userId, "", null)
 *           }
 *      }, true)
 *
 *
 *  @param count CountDownLatch 需要等待的个数
 *  @param timeout CountDownLatch 需要等待的超时时间（单位：ms，小于等于 0，则使用默认的等待时间）
 */
abstract class AsynTask(count: Int = 1, private val timeout: Long = 0) : BaseTask() {
    // 异步转同步辅助类
    private val countDownLatch = CountDownLatch(count)

    override fun doTask(application: Application) {
        // 真正执行任务
        runTask(application, countDownLatch)
    }

    override fun isComplete(): Boolean {
        try {
            if (timeout <= 0) {
                // 超时时间 <=0 ，使用 CountDownLatch 默认的超时时常
                countDownLatch.await()
            } else {
                // 使用 timeout 作为 CountDownLatch 的超时时常
                countDownLatch.await(timeout, TimeUnit.MILLISECONDS)
            }
            isInitCompleted = true
        } catch (e: Exception) {
            e.printStackTrace()
        }
        return super.isComplete()
    }

    /**
     * 异步任务执行
     * @param application 应用程序上下文
     * @param countDownLatch 异步转同步辅助类，用于调用 countDown 方法减少计数
     */
    protected abstract fun runTask(application: Application, countDownLatch: CountDownLatch)


    override fun toString(): String {
        return "${this::class.java.simpleName}(timeout=$timeout, countDownLatch=$countDownLatch , ${getParamStr()})"
    }


}